package com.xianrenit.xianrenpuzi.manager.service.impl;

import com.xianrenit.xianrenpuzi.common.handler.exception.SpzxException;
import com.xianrenit.xianrenpuzi.manager.service.FileService;
import com.xianrenit.xianrenpuzi.manager.util.MinioUtil;
import com.xianrenit.xianrenpuzi.manager.util.SpzxMinioProperties;
import com.xianrenit.xianrenpuzi.model.result.ResultCodeEnum;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import io.minio.RemoveObjectArgs;
import org.joda.time.DateTime;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.InputStream;
import java.util.UUID;

@Service
public class FileServiceImpl implements FileService {
    @Override
    public String upload(String module, MultipartFile file) {
        try {
            //获取上传的文件名称
            String uploadFilename = file.getOriginalFilename();
            //获取上传的文件流
            InputStream fis = file.getInputStream();
            String filename =   module
                    // 时间日期路径 ：  yyyy-MM/dd
                    +  new DateTime().toString("/yyyy-MM/dd/")
                    //拼接唯一的文件名 + 扩展名
                    + System.currentTimeMillis()+"_"
                    + UUID.randomUUID().toString().substring(0,6)
                    +  uploadFilename.substring(uploadFilename.lastIndexOf("."));
            //上面拼接的文件名： idcard/2023-12/29/123123124124_1231ab123.png

            MinioClient client = MinioUtil.getMinioClient();//客户端配置了连接的minio的地址端口账号密码
            //根据配置上传文件
            client.putObject(PutObjectArgs.builder()
                    .bucket(SpzxMinioProperties.BUCKET_NAME) //要上传的桶名称
                    // 参数1：文件输入流，参数2：文件字节数，参数3：是否分片上传 -1不分片
                    .stream(fis , fis.available() , -1) //要上传的文件流
                    .object(filename) //文件上传到桶内的目录+文件名称
                    .build()
            );
            //获取上传成功的文件的地址: 需要我们自己拼接
            //http://192.168.1.170:9000/test2-bucket/idcard/2023-12/29/1703813215915_d65988.png
            // 地址由： minio服务器地址+“/” +桶名 + "/" +filename
            String filePath = SpzxMinioProperties.ENDPOINT
                    +"/" + SpzxMinioProperties.BUCKET_NAME
                    +"/" + filename;
            return filePath;
        } catch (Exception e) {
            throw new SpzxException(ResultCodeEnum.FILE_UPLOAD_ERROR,e);
        }
    }

    @Override
    public void delete(String path) {
        try {
            String deleteFilePath  = path.substring((SpzxMinioProperties.ENDPOINT+"/"
                    +SpzxMinioProperties.BUCKET_NAME+"/").length());
            MinioClient client = MinioUtil.getMinioClient();
            //根据文件的完整地址 获取它在桶内的路径删除文件
            client.removeObject(RemoveObjectArgs.builder()
                    .bucket(SpzxMinioProperties.BUCKET_NAME) //删除那个桶内的文件
                    .object(deleteFilePath) //删除文件在桶内的路径+文件名
                    .build());
        } catch (Exception e) {
            throw new SpzxException(ResultCodeEnum.FILE_DELETE_ERROR,e);
        }
    }
}
